#!/usr/bin/env node

/**
 * 生产环境代码剥离工具
 * 
 * 功能：
 * 1. 移除 @if DEBUG ... @endif 标记的代码块
 * 2. 移除仅用于开发环境的import语句
 * 3. 移除调试方法
 * 
 * 使用方法：
 * node strip-debug-code.js <构建目录>
 * 
 * 示例：
 * node strip-debug-code.js ../build/web-mobile
 * 
 * @author AI Assistant
 * @date 2025-12-01
 */

const fs = require('fs');
const path = require('path');

/**
 * 剥离调试代码
 */
function stripDebugCode(content) {
    let result = content;
    
    // 1. 移除 // @if DEBUG ... // @endif 块（单行注释）
    result = result.replace(/\/\/\s*@if\s+DEBUG[\s\S]*?\/\/\s*@endif/g, '');
    
    // 2. 移除 /* @if DEBUG ... @endif */ 块（多行注释）
    result = result.replace(/\/\*\s*@if\s+DEBUG[\s\S]*?@endif\s*\*\//g, '');
    
    // 3. 移除 @if DEBUG 标记的import语句
    result = result.replace(/\/\/\s*@if\s+DEBUG[\s\S]*?import.*?;[\s\S]*?\/\/\s*@endif/g, '');
    
    // 4. 移除空行（可选）
    result = result.replace(/\n\s*\n\s*\n/g, '\n\n');
    
    return result;
}

/**
 * 处理单个文件
 */
function processFile(filePath, stats) {
    if (!filePath.endsWith('.js') && !filePath.endsWith('.ts')) {
        return;
    }
    
    // 跳过 .d.ts 文件
    if (filePath.endsWith('.d.ts')) {
        return;
    }
    
    try {
        let content = fs.readFileSync(filePath, 'utf8');
        const originalSize = content.length;
        const stripped = stripDebugCode(content);
        const strippedSize = stripped.length;
        
        if (content !== stripped) {
            fs.writeFileSync(filePath, stripped, 'utf8');
            
            const reduction = originalSize - strippedSize;
            const reductionPercent = ((reduction / originalSize) * 100).toFixed(1);
            
            stats.filesProcessed++;
            stats.totalReduction += reduction;
            
            console.log(`✅ ${path.basename(filePath)}: ${originalSize} → ${strippedSize} bytes (-${reductionPercent}%)`);
        }
    } catch (error) {
        console.error(`❌ Error processing ${filePath}:`, error.message);
        stats.errors++;
    }
}

/**
 * 递归处理目录
 */
function processDirectory(dir, stats) {
    if (!fs.existsSync(dir)) {
        console.error(`❌ Directory not found: ${dir}`);
        return;
    }
    
    const files = fs.readdirSync(dir);
    
    files.forEach(file => {
        const filePath = path.join(dir, file);
        
        try {
            const stat = fs.statSync(filePath);
            
            if (stat.isDirectory()) {
                // 跳过 node_modules 等目录
                if (file === 'node_modules' || file === '.git') {
                    return;
                }
                processDirectory(filePath, stats);
            } else {
                processFile(filePath, stats);
            }
        } catch (error) {
            console.error(`❌ Error accessing ${filePath}:`, error.message);
            stats.errors++;
        }
    });
}

/**
 * 主函数
 */
function main() {
    const args = process.argv.slice(2);
    
    if (args.length === 0) {
        console.log('用法: node strip-debug-code.js <构建目录>');
        console.log('示例: node strip-debug-code.js ../build/web-mobile');
        process.exit(1);
    }
    
    const buildDir = path.resolve(args[0]);
    
    console.log('========================================');
    console.log('🚀 生产环境代码剥离工具');
    console.log('========================================');
    console.log(`📁 目标目录: ${buildDir}`);
    console.log('');
    
    const stats = {
        filesProcessed: 0,
        totalReduction: 0,
        errors: 0
    };
    
    const startTime = Date.now();
    
    processDirectory(buildDir, stats);
    
    const endTime = Date.now();
    const duration = ((endTime - startTime) / 1000).toFixed(2);
    
    console.log('');
    console.log('========================================');
    console.log('✅ 处理完成');
    console.log('========================================');
    console.log(`📝 处理文件数: ${stats.filesProcessed}`);
    console.log(`💾 减少大小: ${(stats.totalReduction / 1024).toFixed(2)} KB`);
    console.log(`❌ 错误数: ${stats.errors}`);
    console.log(`⏱️  耗时: ${duration}s`);
    console.log('========================================');
    
    if (stats.errors > 0) {
        process.exit(1);
    }
}

// 运行
main();

